package com.wei.czz.config;

import com.wei.czz.framework.common.service.InitService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-06-23 22:37:00
 * className: InitCacheRunner 程序初始化业务执行类
 * version: 1.0
 * description:
 */
@Component
public class InitCacheRunner implements CommandLineRunner {

    private final static Logger log = LoggerFactory.getLogger(InitCacheRunner.class);

    @Value("${system.cache.init}")
    private Boolean initCache;

    private final InitService initService;

    private final ApplicationContext applicationContext;

    public InitCacheRunner(InitService initService, ApplicationContext applicationContext) {
        this.initService = initService;
        this.applicationContext = applicationContext;
    }

    /**
     * 程序初始化完成后，也就是Spring容器构造Bean等内容都完成了，即将完成程序启动的时候，调用此方法，完成程序缓存初始化
     * @param args
     */
    @Override
    public void run(String... args) {

        log.info("开始执行项目初始化业务");

        try {
            if (initCache) {
                // 初始化菜单缓存
                initService.initMenuCache();
                // 初始化用户缓存
                initService.initUserCache();
                // 初始化用户空间缓存
                initService.initUserSpaceCache();
                // 初始化博客缓存
                initService.initBlogCache();
                // 初始化博客关联标签数量缓存
                initService.initBlogTagRelationCache();
            } else {
                log.info("配置文件设置程序启动不会初始化缓存!");
            }

            // 初始化系统限流规则
            initService.initLimit();
        } catch (Exception e) {

            log.error(e.getMessage());
            log.error("执行项目初始化业务发生异常，终止程序启动!!!");

            int exitCode = SpringApplication.exit(applicationContext, () -> 0);
            System.exit(exitCode);
        }
        log.info("执行项目初始化业务结束");
    }
}
